抓取网页数据的几种方法

相信所有个人网站的站长都有抓取别人数据的经历吧,目前抓取别人网站数据的方式无非两种方式:

  一、使用第三方工具,其中最著名的是火车头采集器,在此不做介绍。

  二、自己写程序抓取,这种方式要求站长自己写程序,可能对对站长的开发能力有所要求了。

  本人起初也曾试着用第三方的工具抓取我所需要的数据,由于网上的流行的第三方工具不是不符合我的要求,就是过于复杂,我一时没有搞明白怎么用,后来索性决定自己写吧,现在本人基本上半天可以搞定一个网站(只是程序开发时间,不包括数据抓取的时间)。

    经过一段时间的数据抓取生涯,也曾遇到了很多困难,其中最常见的一个就是关于分页数据的抓取问题,原因在于分数据分页的形式有很多种,下面我主要针对三种形式介绍一下抓取分页数据的方法,此类文章虽然在网上见过很多,但每次拿别人的代码总也总是有各种各样的问题,下面各种方式的代码都是能正确执行,并且我目前也正在使用中的。本文中代码实现是用C#语言来实现的,我想其他语言原理大致相同

下面切入正题:

     第一种方式:URL地址中包含分页信息,这种形式是最简单的,这种形式使用第三方工具抓取也很简单,基本上不用写代码,对于我这种宁可自己花个半天时间写代码也懒得学第三方工具的人,还是通过自己写代码实现了;

    这种方式就是通过循环生成数据分页的URL地址 如: 这样通过HttpWebRequest访问对应URL地址,返回对应页面的html文本,接下来的任务就是对字符串的解析,将需要的内容保存到本地数据库内;抓取的代码可参考下面:

 public string GetResponseString(string url)
        {
            
            string _StrResponse = "";
            HttpWebRequest _WebRequest = (HttpWebRequest)WebRequest.Create(url);
            _WebRequest.UserAgent = "MOZILLA/4.0 (COMPATIBLE; MSIE 7.0; WINDOWS NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
            _WebRequest.Method = "GET";
            WebResponse _WebResponse = _WebRequest.GetResponse();
            StreamReader _ResponseStream = new StreamReader(_WebResponse.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"));
            _StrResponse = _ResponseStream.ReadToEnd();
            _WebResponse.Close();
            _ResponseStream.Close();
            return _StrResponse;
        }   

上面的代码可以返回对应页面的html内容的字符串,剩下的工作就是从这个字符串中获取自己关心的信息了。

第二种方式:可能是通过asp.net开发的网站常会遇到,它的分页控件通过post方式 提交分页信息到后台代码,如.net下Gridview自带的分页功能,当你点击分页的页码时,会发现URL地址没有变化,但页码变化了,页面内容也变化,仔细看会发现,把鼠标移到每个页码上的时候状态栏会显示 javascript:__dopostback("gridview","page1")等等 之类的代码,这种形式其实也不是很难,因为毕竟有地方得到页码的规律可寻。

   我们知道http请求提交的方式有两种一种是get一种是Post,第一种方式是get方式,那么第二种方式就是post方式,具体提交的原理不必细说,不是本文的重点

抓取这种页面 需要注意asp.net页面的几个重要的元素

   一、 __VIEWSTATE ,这个应该是.net特有的,也是让.net开发人员既爱又恨的东西,当你打开一个网站的某一个页面的时候,如果发现这个东西,而且后面还跟随着一大堆乱七八糟的字符的时候,那这个网站肯定是用asp.net写的了;

   二、__dopostback方法,这个是asp.net页面自动生成一个javascript方法,包含两个参数,__EVENTTARGET,__EVENTARGUMENT,这两个参数可以参看页码对应的内容,因为点击翻页的时候,会将页码信息传给这两个参数。

   三、__EVENTVALIDATION 这个也也应该是asp.net特有的东西

大家也不用 太关心这三个东西都是干什么的,只需要注意自己写代码抓取页面的时候 记得提交这三个元素就可以了。

    和第一种方式一样,肯定要通过循环的方式是去拼凑_dopostback的两个参数,只需要拼其中包含了页码信息的参数即可。这里有一个需要注意的地方,就是在每次通过Post提交请求下一页的时候,先应得到当前页的__VIEWSTATE 信息和__EVENTVALIDATION信息,所以分页数据的第一页可采用第一种方式得到页码内容然后,同时取出对应的__VIEWSTATE 信息和__EVENTVALIDATION信息,然后再做循环处理下一页面,然后每抓取完一个页面,再记录下__VIEWSTATE 信息和__EVENTVALIDATION信息,为下一个页面post提交数据使用

参考代码如下:

 for (int i = 0; i < 1000; i++)
            {
                System.Net.WebClient WebClientObj = new System.Net.WebClient();
                System.Collections.Specialized.NameValueCollection PostVars = new System.Collections.Specialized.NameValueCollection();
                PostVars.Add("__VIEWSTATE", "此处是您需要提前得到的信息");
                PostVars.Add("__EVENTVALIDATION", "此处是您需要提前得到的信息");
                PostVars.Add("__EVENTTARGET", "此处是__dopostback方法对应的参数");
                PostVars.Add("__EVENTARGUMENT",  "此处是__dopostback方法对应的参数");
                WebClientObj.Headers.Add("ContentType", "application/x-www-form-urlencoded");
                try
                {
                    byte[] byte1 = WebClientObj.UploadValues("http://www.xxxx.cn/messagelist.aspx", "POST", PostVars);
                    string ResponseStr = Encoding.UTF8.GetString(byte1); //得到当前页面对应的html 文本字符串
                    GetPostValue(ResponseStr);//得到当前页面对应的 __VIEWSTATE 等上面需要的信息,为抓取下一页面使用
                    SaveMessage(ResponseStr);//保存自己关心的内容到数据库中
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }

第三种方式是最麻烦的,也是最恶心的,这种页面 在你翻页的过程中没有任何一个地方可以找到页码信息,这种方式费了我很大的力气,后来采用了一个比较狠的办法,用代码模拟手动翻页,这种方式应该可以处理任何形式的翻页数据,原理就是,用代码模拟人工点击翻页链接,用代码一页一页的翻页,然后一页一页的抓取。

如果想了解更多的信息 可访问  http://www.zxskb.com/bbs/3.html

这个是我个人站上 新建的一个站长随笔功能,我会定期发布一些我的个人心得,如果有兴趣的可以去看看,本贴算是我第一个随笔吧
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: VBA(Visual Basic for Applications)是一种宏语言,可以通过编写代码来实现自动化任务。使用VBA抓取网页数据方法可以通过以下步骤来完成: 1. 创建一个Excel文件,并在工作表中打开"开发者工具"选项卡。 2. 在"开发者工具"选项卡中,点击"Visual Basic"按钮,打开VBA编辑器。 3. 在VBA编辑器中,选择"插入",然后选择"模块",创建一个新的模块。 4. 在新的模块中,编写VBA代码来实现抓取网页数据的功能。以下是一个简单的示例代码: Sub GetDataFromWebsite() Dim ie As InternetExplorer Dim doc As HTMLDocument Dim table As Object Dim i As Integer '创建一个Internet Explorer对象 Set ie = CreateObject("InternetExplorer.Application") '打开一个网页 ie.Visible = True ie.navigate "http://www.example.com" '等待网页加载完成 Do While ie.readyState <> READYSTATE_COMPLETE DoEvents Loop '将网页内容存储在一个HTMLDocument对象中 Set doc = ie.document '找到网页中的表格 Set table = doc.getElementsByTagName("table")(0) '遍历表格的行和列,并将数据输出到Excel工作表中 i = 1 For Each row In table.Rows For Each cell In row.Cells Worksheets("Sheet1").Cells(i, 1).Value = cell.innerText i = i + 1 Next cell Next row '关闭Internet Explorer对象 ie.Quit End Sub 以上代码中,我们首先创建一个InternetExplorer对象,然后使用该对象来打开指定的网页。在网页加载完成后,我们通过HTMLDocument对象来获取网页内容,并使用getElementsByTagName方法找到需要抓取的表格。最后,我们可以使用循环遍历表格的行和列,并将数据输出到Excel工作表中。 总结来说,使用VBA抓取网页数据方法包括使用InternetExplorer对象来打开网页,使用HTMLDocument对象来获取网页内容,然后解析网页获取所需数据,并将数据输出到Excel或其他文件中。这样就可以实现自动化抓取网页数据的功能。 ### 回答2: VBA(Visual Basic for Applications)是一种用于编写宏和自动化任务的编程语言,可以通过它来实现抓取网页数据的功能。 在VBA中,我们可以使用Internet Explorer对象来模拟浏览器,访问网页并获取数据。以下是一种常见的抓取网页数据方法: 1. 创建一个新的VBA模块,并在其中添加以下代码: ``` Sub GrabDataFromWebsite() Dim IE As Object Dim HTMLDoc As Object Dim HTMLTable As Object Dim HTMLRow As Object Dim HTMLCell As Object ' 创建新的Internet Explorer对象 Set IE = CreateObject("InternetExplorer.Application") ' 打开网页 IE.navigate "https://www.example.com" ' 等待IE加载完成 Do While IE.Busy Or IE.readyState <> 4 DoEvents Loop ' 获取网页的HTML文档 Set HTMLDoc = IE.document ' 根据网页结构,定位到目标表格 Set HTMLTable = HTMLDoc.getElementById("tableID") ' 遍历表格的行和列,抓取数据 For Each HTMLRow In HTMLTable.Rows For Each HTMLCell In HTMLRow.Cells ' 在这里可以对数据进行处理或存储操作 MsgBox HTMLCell.innerText Next HTMLCell Next HTMLRow ' 关闭Internet Explorer对象 IE.Quit ' 清除对象变量的引用 Set IE = Nothing Set HTMLDoc = Nothing End Sub ``` 上述代码中,我们首先创建了一个Internet Explorer对象(IE),然后使用IE.navigate方法打开了指定的网页。在加载网页完成后,我们可以使用IE.document获取网页的HTML文档,并根据网页结构定位到目标数据所在的表格(或其他元素)。随后,使用For Each循环遍历表格的行和列,获取数据并进行处理或存储操作。最后,我们关闭IE对象并清除对象变量的引用。 需要注意的是,抓取网页数据时需要了解网页的HTML结构,以便准确定位需要抓取数据。此外,还可以根据需要使用其他方法和属性来处理网页中的数据,例如获取特定元素的属性值、点击按钮或链接等。 以上是一种基本的抓取网页数据方法,在实际使用中还可以根据具体需求进行适当的修改和扩展。 ### 回答3: VBA抓取网页数据方法主要包括以下几个步骤: 1. 创建一个新的VBA宏,并在宏中引用"Microsoft Internet Controls"和"Microsoft HTML Object Library"这两个引用库。这些库将提供用于处理网页网页元素的对象和方法。 2. 使用Internet Explorer对象来打开要抓取数据网页。可以使用`Set ie = New InternetExplorer`来创建一个新的Internet Explorer对象,并使用`ie.Navigate`方法来打开指定的网页。 3. 等待网页加载完成。可以使用`Do While ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE`来等待网页加载完成。 4. 使用Document对象访问网页的HTML代码。可以使用`Set doc = ie.Document`来获取网页的Document对象,并使用`doc.getElementByID`、`doc.getElementsByTagName`等方法来定位网页中的元素。 5. 使用获取到的Document对象和元素对象来定位和提取需要的数据。可以使用元素对象的`innerText`、`getAttribute`等属性和方法来获取元素的文本内容或属性值。 6. 将获取到的数据保存到Excel等工作簿或其他数据源中。可以使用`Range`对象将数据写入到指定的单元格中,或使用ADO对象将数据插入到数据库中。 7. 关闭Internet Explorer对象,并释放相关资源。可以使用`ie.Quit`来关闭Internet Explorer对象。 需要注意的是,抓取网页数据时,应遵守网页的使用规定和法律法规,避免非法获取或滥用数据。同时,由于网页结构和数据可能会变化,需要根据具体网页的情况进行适当的调整和修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值